//package com.xdtech.jmax.test;
//
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//import java.util.concurrent.TimeUnit;
//
//import org.apache.log4j.Logger;
//import org.codehaus.jettison.json.JSONException;
//import org.codehaus.jettison.json.JSONObject;
//import org.springframework.dao.DataAccessException;
//import org.springframework.data.redis.connection.DataType;
//import org.springframework.data.redis.connection.RedisConnection;
//import org.springframework.data.redis.core.RedisCallback;
//import org.springframework.data.redis.core.RedisTemplate;
//
//import redis.clients.jedis.Pipeline;
//
//import com.xdtech.common.utils.ApplicationContextUtil;
//
///**
// * 将redis交给spring管理，不再手工维护
// * 
// * @author <a href="max.zheng@zkteco.com">郑志雄</>
// * @version 1.0.0
// * @since 2015-2-6 上午8:31:18
// */
//public class Redis
//{
//	private static Logger log = Logger.getLogger(Redis.class);
//	private RedisTemplate<String, String> rt = (RedisTemplate<String, String>) ApplicationContextUtil.getContext().getBean("redisTemplate");
//	// 注意，这里没有final
//	private static Redis redis = new Redis();
//	public static Redis getInstance()
//	{
//		return redis;
//	}
//
//	/**
//	 * 返回key对应list的长度，key不存在返回0
//	 * 
//	 * @param key
//	 * @return list 长度
//	 */
//	public long llenKey(String key)
//	{
//		long value = rt.opsForList().size(key);
//		return value;
//	}
//
//	/**
//	 * 返回key对应set的长度，key不存在返回0
//	 * 
//	 * @param key
//	 * @return list 长度
//	 */
//	public long scardKey(String key)
//	{
//		long value = rt.opsForSet().size(key);
//		return value;
//	}
//
//	public Long del(String... keys)
//	{
//		long number = 0;
//		for (int i = 0; i < keys.length; i++)
//		{
//			rt.delete(keys[i]);
//			number++;
//		}
//
//		return number;
//	}
//
//	/**
//	 * 查找所有符合给定模式 pattern 的 key 。 * 匹配数据库中所有 key 。 h?llo 匹配 hello ， hallo 和
//	 * hxllo 等。 h*llo 匹配hllo 和 heeeeello 等。 h[ae]llo 匹配 hello 和 hallo ，但不匹配
//	 * hillo 。
//	 * 
//	 * @return 返回set集合
//	 */
//	public Set<String> keys(String key)
//	{
//		Set<String> setKeys = rt.keys(key);
//		return setKeys;
//	}
//
//	/**
//	 * 检查给定 key 是否存在。
//	 * 
//	 * @return 返回0(不存在)或者1(存在)
//	 */
//	public boolean exists(String key)
//	{
//		boolean exists = rt.hasKey(key);
//		return exists;
//	}
//
//	// -----------------------------------------String(字符串)------------------------------------------------
//	/**
//	 * 字符串简单key - value
//	 * 
//	 * @author <a href="max.zheng@zkteco.com">郑志雄</>
//	 * @since 2015-2-6 上午9:28:38
//	 * @param key
//	 * @param value
//	 * @return
//	 */
//	public boolean set(String key, String value)
//	{
//		rt.opsForValue().set(key, value);
//		return true;
//	}
//
//	/**
//	 * 获取key对应的字符串value
//	 * 
//	 * @author <a href="max.zheng@zkteco.com">郑志雄</>
//	 * @since 2015-2-6 上午9:29:39
//	 * @param key
//	 * @return
//	 */
//	public String get(String key)
//	{
//		String value = rt.opsForValue().get(key);
//		return value;
//
//	}
//
//	/**
//	 * 设置Json对象，对外封装对json对象的转换-darcy20130124
//	 */
//	public boolean setJson(String key, JSONObject value)
//	{
//		rt.opsForValue().set(key, value.toString());
//		return true;
//	}
//
//	/**
//	 * @throws JSONException
//	 * 获取Json对象，对外封装对json对象的转换-darcy20130124
//	 * @return json
//	 */
//	public JSONObject getJson(String key)
//	{
//		String value = rt.opsForValue().get(key);
//		JSONObject valueJson = null;
//		try
//		{
//			if (null != value)
//			{
//				valueJson = new JSONObject(value);
//			}
//		}
//		catch (JSONException e)
//		{
//			log.error("redis getJson error key=" + key, e);
//		}
//		return valueJson;
//	}
//
//	// -----------------------------------------List(列表)----------------------------------------------------
//
//	/**
//	 * 将一个或多个值 value 插入到list列表 key 的表头 如果有多个 value 值，那么各个 value
//	 * 值按从左到右的顺序依次插入到表头： 比如对一个空列表 mylist 执行 LPUSH mylist a b c ，则结果列表为 c b a
//	 * ，等同于执行执行命令 LPUSH mylist a 、 LPUSH mylist b 、 LPUSH mylist c 。
//	 */
//	public boolean lpush(String key, String... strings)
//	{
//		long rs = rt.opsForList().leftPushAll(key, strings);
//		return rs > 0;
//	}
//
//	/**
//	 * 将一个或多个值 value 插入到List列表 key 的表尾(最右边)。
//	 * 
//	 * @param key
//	 * @param strings
//	 */
//	public boolean rpush(String key, String strings)
//	{
//		long rs = rt.opsForList().rightPush(key, strings);
//		return rs > 0;
//	}
//
//	/**
//	 * 获取lpush和rpush中所有 的元素
//	 * 
//	 * @param key
//	 * @return list<String>
//	 */
//	public List<String> lrange(String key)
//	{
//		return rt.opsForList().range(key, 0, -1);
//	}
//
//	/**
//	 * 读取list中的数据,输入索引值 Darcy 20121107
//	 * 
//	 * @param key
//	 * @return list中数据
//	 */
//	public List<String> lrange(String key, long startIndex, long endIndex)
//	{
//		return rt.opsForList().range(key, startIndex, endIndex);
//	}
//
//	/**
//	 * 将一个或者多个值放到set中。
//	 * 
//	 * @param key
//	 * @param strings
//	 */
//	public boolean sadd(String key, String... members)
//	{
//		long rs = rt.opsForSet().add(key, members);
//		return rs > 0;
//	}
//
//	/**
//	 * 获取Key对应的Set，返回所有的数据。 无序
//	 * 
//	 * @param key
//	 * @param strings
//	 */
//	public Set<String> smembers(String key)
//	{
//		Set<String> ret = rt.opsForSet().getOperations().keys(key);
//		return ret;
//	}
//
//	/**
//	 * 删除Set中部分数据。要求Key保存的必须为Set，不能为list，否则将报错。
//	 */
//	public void srem(String key, String... value)
//	{
//		rt.opsForSet().remove(key, value);
//	}
//
//	/**
//	 * 保存map
//	 * 
//	 * @param key
//	 * @param map
//	 */
//	public void hmset(String key, Map<String, String> hashMap)
//	{
//		rt.opsForHash().putAll(key, hashMap);
//	}
//
//	/**
//	 * hash表数据新增
//	 * 
//	 * @param key
//	 * @param field
//	 * @param value
//	 * @return
//	 * @edit max.zheng
//	 */
//	public Long setValueToHash(String key, String field, String value)
//	{
//		rt.opsForHash().put(key, field, value);
//		return 1L;
//	}
//
//	public List<String> hmget(String key, String... fields)
//	{
//
//		List<String> rsList = new ArrayList<String>();
//		for (int i = 0; i < fields.length; i++)
//		{
//			String obj = getFromHash(key, fields[i]);
//			if (null != obj)
//			{
//				rsList.add(obj);
//			}
//
//		}
//		return rsList;
//	}
//
//	public List<String> hvals(String key)
//	{
//		//		//content[1].replace("\"", ""), content[2].replace("\"", "")
//		//		rt.opsForHash().
//		//		Jedis jedis = null;
//		//		boolean success = true;
//		//		List<String> values = null;
//		//		try
//		//		{
//		//			jedis = getJedis();
//		//			values = jedis.hvals(key);
//		//		}
//		//		catch (Exception e)
//		//		{
//		//			log.error("Redis getFromHash(key,field) error", e);
//		//			success = false;
//		//			if (jedis != null)
//		//			{
//		//				returnBrokenResource(jedis);
//		//			}
//		//		}
//		//		finally
//		//		{
//		//			if (success && jedis != null)
//		//			{
//		//				returnResource(jedis);
//		//			}
//		//		}
//		return null;
//	}
//
//	/**
//	 * hash获取数据
//	 * 
//	 * @param key
//	 * @param field
//	 * @return
//	 * @edit max.zheng
//	 */
//	public String getFromHash(String key, String field)
//	{
//		Object obj = rt.opsForHash().get(key, field);
//		return obj == null ? null : obj.toString();
//	}
//
//	/**
//	 * hash中删除数据
//	 * 
//	 * @param key
//	 * @param field
//	 * @return
//	 * @edit max.zheng
//	 */
//	public Long delFromHash(String key, String field)
//	{
//		rt.opsForHash().delete(key, field);
//		return 1L;
//	}
//
//	/**
//	 * 查询map中的数据
//	 * 
//	 * @param key
//	 * 
//	 */
//	public Map<String, String> hgetAll(String key)
//	{
//		Map<Object, Object> map = rt.opsForHash().entries("key");
//		Map<String, String> rsMap = new HashMap<String, String>();
//		for (Object objkey : map.keySet())
//		{
//			rsMap.put(objkey.toString(), map.get(objkey).toString());
//		}
//		return rsMap;
//	}
//
//	/**
//	 * 设置key的过期时间
//	 * 
//	 * @param key
//	 * @param unixTime
//	 */
//	public void expire(String key, int unixTime)
//	{
//		rt.expire(key, unixTime, TimeUnit.SECONDS);
//	}
//
//	/**
//	 * 设置key的过期时间
//	 * 
//	 * @param key
//	 * @param unixTime
//	 */
//	public void expireAt(String key, long unixTime)
//	{
//		rt.expireAt(key, new Date(unixTime));
//	}
//
//	// ------------------------------------------Connection(连接)----------------------------------------------
//
//	/**
//	 * 使用客户端向 Redis 服务器发送一个 PING 通常用于测试与服务器的连接是否仍然生效，或者用于测量延迟值。
//	 * 
//	 * @return 如果连接正常就返回一个 PONG ，否则返回一个连接错误。
//	 */
//	public String ping()
//	{
//		return rt.execute(new RedisCallback()
//		{
//			public String doInRedis(RedisConnection connection) throws DataAccessException
//			{
//
//				return connection.ping();
//			}
//		});
//	}
//
//	// ------------------------------------------Server(服务器-------------------------------------------------
//
//	/**
//	 * 清空整个 Redis 服务器的数据(删除所有数据库的所有 key )。
//	 * 
//	 * @param key
//	 * @return 总是返回 OK 。
//	 */
//	public boolean flushAll()
//	{
//		return rt.execute(new RedisCallback()
//		{
//			public String doInRedis(RedisConnection connection) throws DataAccessException
//			{
//				connection.flushDb();
//				return "ok";
//			}
//		});
//	}
//
//	/**
//	 * 获得key中数据的类型
//	 * 
//	 * @param key
//	 * @return
//	 */
//	public String getType(String key)
//	{
//		DataType dType = rt.type(key);
//		return dType.toString();
//	}
//
//	/**
//	 * 移除list中左边第一个元素
//	 * 
//	 * @return
//	 */
//	public String lpop(String key)
//	{
//		return rt.opsForList().leftPop(key);
//	}
//
//	/**
//	 * 根据参数 count 的值，移除列表(list)中与参数 value 相等的元素。
//	 * 
//	 * @return
//	 */
//	public void lrem(String key, long count, String value)
//	{
//		rt.opsForList().remove(key, count, value);
//
//	}
//
//	/**
//	 * Trim an existing list so that it will contain only the specified range of
//	 * elements specified. Start and end are zero-based indexes. 0 is the first
//	 * element of the list (the list head), 1 the next element and so on. For
//	 * example LTRIM foobar 0 2 will modify the list stored at foobar key so
//	 * that only the first three elements of the list will remain. start and end
//	 * can also be negative numbers indicating offsets from the end of the list.
//	 * For example -1 is the last element of the list, -2 the penultimate
//	 * element and so on. Indexes out of range will not produce an error: if
//	 * start is over the end of the list, or start > end, an empty list is left
//	 * as value. If end over the end of the list Redis will threat it just like
//	 * the last element of the list.
//	 * 
//	 * @author liangm 2013-07-05
//	 * @param key
//	 * @param start
//	 * @param end
//	 */
//	public void ltrim(String key, long start, long end)
//	{
//		rt.opsForList().trim(key, start, end);
//	}
//
//	/** 往set里追加set */
//	public void saddSet(String key, Set<String> strSet)
//	{
//		for (String value : strSet)
//		{
//			rt.opsForSet().add(key, value);
//		}
//	}
//
//	public String info()
//	{
//		return rt.toString();
//	}
//
//	public Long dbSize()
//	{
//		return rt.execute(new RedisCallback()
//		{
//			public Long doInRedis(RedisConnection connection) throws DataAccessException
//			{
//				return connection.dbSize();
//			}
//		});
//	}
//
//	public String echo(final String content)
//	{
//		return rt.execute(new RedisCallback()
//		{
//			public String doInRedis(RedisConnection connection) throws DataAccessException
//			{
//				return connection.echo(content.getBytes()).toString();
//			}
//		});
//	}
//
//	/**
//	 * 批量执行命令（使用Pipeline调用操作redis的方法，和jedis用法一样
//	 * 最后使用pipeline.syncAndReturnAll()执行命令）
//	 * 
//	 * @return Pipeline对象
//	 */
//	public Pipeline pipelined()
//	{
//		//		rt.execute(new RedisCallback<Pipeline>() {
//		//
//		//			public Pipeline doInRedis(RedisConnection connection) {
//		//				return connection.
//		//			}
//		//		}, true);
//		return null;
//	}
//}
